package modelo.escenario;

import java.util.ArrayList;
import java.util.List;

import modelo.carrera.Conductor;
import modelo.comportamiento.Comportamiento;
import modelo.controles.Camara;
import modelo.controles.Policia;
import modelo.geometria.Grilla;
import modelo.geometria.Vector;
import modelo.obstaculos.Obstaculo;
import modelo.seniales.ColorSemaforo;
import modelo.seniales.EsquinaSemaforo;
import modelo.seniales.Semaforo;
import modelo.seniales.carteles.CirculacionExclusiva;
import modelo.seniales.carteles.LimiteVelocidad;
import modelo.vehiculos.Automovil;
import modelo.vehiculos.Colectivo;
import modelo.vehiculos.SentidoVehiculo;

public abstract class ConstructorEscenario {

	private final static int semaforoTiempoCambioColor = 8; 
		
	public static GuiaT construirGuiaTEstandar(){
	
		Cruce cruce_Huergo_Independencia = new Cruce("HuergoIndependencia", new Vector(3,3), 6, 6);
		Cruce cruce_Huergo_Chile = new Cruce("HuergoIndependencia", new Vector(23,3), 6,10);
		Cruce cruce_Independencia_PaseoColon = new Cruce("IndependenciaPaseoColon", new Vector(3,18),8,6);
		Cruce cruce_Independencia_Balcarce = new Cruce("IndependenciaBalcarce", new Vector(3,32),4,6);
		Cruce cruce_Balcarce_Chile = new Cruce("BalcarceChile", new Vector(23,32),4,10);
		Cruce cruce_Balcarce_Mexico = new Cruce("BalcarceMexico", new Vector(45,32),4,6);
		Cruce cruce_Mexico_PaseoColon = new Cruce("MexicoPaseoColon", new Vector(45,18),8,6);
		Cruce cruce_Mexico_Huergo = new Cruce("MexicoHuergo", new Vector(45,3),6,6);
		Cruce cruce_Chile_PaseoColon= new Cruce("ChilePaseoColon", new Vector(23,18),8,10);
		
		Arteria avIngHuergo = Arteria.crearAvenida("IngenieroHuergo");
		Arteria avIndependencia = Arteria.crearAvenida("Independencia");
		Arteria calleBalcarce = Arteria.crearCalle("Balcarce");
		Arteria calleMexico = Arteria.crearCalle("Mexico");
		Arteria calleChile = Arteria.crearCalle("Chile");
		Arteria avPaseoColon = Arteria.crearAvenida("PaseoColon");
		
		List<Cuadra> cuadras = new ArrayList<Cuadra>();
		
		Cuadra cuadraHuergoIndependencia = new Cuadra("HuergoIndependencia", new Vector(12,3),6,12,cruce_Huergo_Chile, cruce_Huergo_Independencia, avIngHuergo, Cuadra.SentidoTransitable.OESTE);
		cuadras.add(cuadraHuergoIndependencia);
		
		Cuadra cuadraHuergoChile = new Cuadra("HuergoChile", new Vector(35,3),6,14, cruce_Mexico_Huergo, cruce_Huergo_Chile,  avIngHuergo, Cuadra.SentidoTransitable.OESTE);
		cuadras.add(cuadraHuergoChile);
		
		Cuadra cuadraIndependenciaPaseoColon = new Cuadra("IndependenciaPaseoColon", new Vector(3,10),8,6,cruce_Huergo_Independencia, cruce_Independencia_PaseoColon, avIndependencia, Cuadra.SentidoTransitable.NORTE);
		cuadras.add(cuadraIndependenciaPaseoColon);
		
		Cuadra cuadraIndependenciaBalcarce = new Cuadra("IndependenciaBalcarce", new Vector(3,26),8,6,cruce_Independencia_PaseoColon, cruce_Independencia_Balcarce, avIndependencia, Cuadra.SentidoTransitable.NORTE);
		cuadras.add(cuadraIndependenciaBalcarce);
		
		Cuadra cuadraBalcarceChile = new Cuadra("BalcarceChile", new Vector(12,32),4,12, cruce_Independencia_Balcarce, cruce_Balcarce_Chile, calleBalcarce, Cuadra.SentidoTransitable.ESTE);
		cuadras.add(cuadraBalcarceChile);
		
		Cuadra cuadraBalcarceMexico = new Cuadra("BalcarceMexico", new Vector(35,32), 4,14, cruce_Balcarce_Chile, cruce_Balcarce_Mexico, calleBalcarce,Cuadra.SentidoTransitable.ESTE);
		cuadras.add(cuadraBalcarceMexico);
		
		Cuadra cuadraMexicoPaseoColon = new Cuadra("MexicoPaseoColon", new Vector(45,26),8,6,cruce_Balcarce_Mexico, cruce_Mexico_PaseoColon, calleMexico, Cuadra.SentidoTransitable.SUR);
		cuadras.add(cuadraMexicoPaseoColon);
		
		Cuadra cuadraMexicoHuergo = new Cuadra("MexicoHuergo", new Vector(45,10),8,6,cruce_Mexico_PaseoColon, cruce_Mexico_Huergo, calleMexico, Cuadra.SentidoTransitable.SUR);
		cuadras.add(cuadraMexicoHuergo);
		
		Cuadra cuadraChilePaseoColon = new Cuadra("ChilePaseoColon", new Vector(23,10),8,10, cruce_Huergo_Chile, cruce_Chile_PaseoColon, calleChile, Cuadra.SentidoTransitable.NORTE);
		cuadras.add(cuadraChilePaseoColon);
		
		Cuadra cuadraChileBalcarce = new Cuadra("ChileBalcarce", new Vector(23,26),8,10, cruce_Chile_PaseoColon, cruce_Balcarce_Chile, calleChile, Cuadra.SentidoTransitable.NORTE);
		cuadras.add(cuadraChileBalcarce);
		
		Cuadra cuadraPaseoColonChile = new Cuadra("PaseoColonChile", new Vector(12,18),8,12,cruce_Independencia_PaseoColon, cruce_Chile_PaseoColon, avPaseoColon, Cuadra.SentidoTransitable.ESTE);
		cuadras.add(cuadraPaseoColonChile);
		
		Cuadra cuadraPaseoColonMexico = new Cuadra("PaseoColonMexico", new Vector(35,18),8,14,cruce_Chile_PaseoColon, cruce_Mexico_PaseoColon, avPaseoColon, Cuadra.SentidoTransitable.ESTE);
		cuadras.add(cuadraPaseoColonMexico);
		
		GuiaT mapa = new GuiaT(cuadras);
		
		return mapa;
	}
	
	public static Grilla<Obstaculo> construirElementosEnEscenarioEstandar(){
	
		Grilla<Obstaculo> grilla = new Grilla<Obstaculo>();
		
		LimiteVelocidad cartelLimiteVelocidadMaximaAvenidaPaseoColon = new LimiteVelocidad(1, new Vector(41,15), Arteria.VELOCIDAD_MAXIMA_AVENIDA, true);
		grilla.addElemento(cartelLimiteVelocidadMaximaAvenidaPaseoColon);
		
		Camara camaraPaseoColonMexico = new Camara(1, new Vector(41,15),1,1,cartelLimiteVelocidadMaximaAvenidaPaseoColon);
		grilla.addElemento(camaraPaseoColonMexico);
		
		Semaforo semaforoChilePaseoColon = new Semaforo(1, new Vector(27,13),1, EsquinaSemaforo.FIN, ColorSemaforo.ROJO,semaforoTiempoCambioColor );
		grilla.addElemento(semaforoChilePaseoColon);
		
		Policia policia = new Policia(1, new Vector(27,13), 1, 5, semaforoChilePaseoColon);
		grilla.addElemento(policia);
		
		CirculacionExclusiva cartelCirculacionExclusivaColectivo = new CirculacionExclusiva(1, new Vector(7,5), new Colectivo(null, new Vector(1,1), new Vector(1,21), SentidoVehiculo.NORTE, 1, 1,.200,.200,.200,.200,null));
		grilla.addElemento(cartelCirculacionExclusivaColectivo);
		
		Semaforo semaforoHuergoMexico = new Semaforo(2, new Vector(35,3),1, EsquinaSemaforo.FIN, ColorSemaforo.AMARILLO,semaforoTiempoCambioColor );
		grilla.addElemento(semaforoHuergoMexico);
	
		Conductor conductor = new Conductor(new Comportamiento());
		Automovil autoAbandonado = new Automovil(conductor, new Vector(3,10), new Vector(3,20), SentidoVehiculo.OESTE, 2, 3, 0, 0, 0, 0);
		grilla.addElemento(autoAbandonado);
		
		return grilla;
	}
}
